/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package scil.telas;

import java.awt.Toolkit;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;


/**
 *
 * @author jamesson
 */
public class JTextFieldValidator extends PlainDocument
{

    	/**
     * Constante para o filtrar a entrada permitindo caracteres do alfabeto
     * 'a-z' ou 'A-Z'
     */
    public static final byte FILTRO_ENTRADA_ALFABETO = 1;

    /**
     * Constante para o filtrar a entrada permitindo caracteres numericos
     * '0-9'
     */
    public static final byte FILTRO_ENTRADA_NUMERICO = 2;

    /**
     * Constante para o filtrar a entrada permitindo caracteres de espaço
     * em branco ' '
     */
    public static final byte FILTRO_ENTRADA_ESPACO = 4;

    /**
     * Constante para o filtrar a entrada permitindo qualquer caracter
     */
    public static final byte FILTRO_ENTRADA_QUALQUER = 0xF;

    /**
     * Comment for <code>serialVersionUID</code>
     */
    private static final long serialVersionUID = 3256718502873281079L;

    /**
     * Comment for <code>serialVersionUID</code>
     */
    private int iMaxLength;

    /**
     * Byte correspondendo aas permissoes de entrada passadas como
     * parametro do construtor.
     */
    private int filtroEntrada;

    /**
     * Construtor da classe
     * @param maxlen
     * @param filtroEntrada
     */
    public JTextFieldValidator(int maxlen, int filtroEntrada) {
        super();
        iMaxLength = maxlen;
        this.filtroEntrada = filtroEntrada;
    }

    /**
     * Implementacao do metodo que insere conteudo de texto no Document.
     * Tambem faz as validaoces no texto antes de inseri-lo.
     */
    @Override
    public void insertString(int offset, String str, AttributeSet attr)
            throws BadLocationException {

        if (str == null) {
            return;
        }

        // validando os caracteres de entrada
        for (int i = 0; (filtroEntrada != FILTRO_ENTRADA_QUALQUER)
                && i < str.length(); i++) {

            boolean algumValido = false;

            if ((filtroEntrada & FILTRO_ENTRADA_ALFABETO) != 0) {
                algumValido = algumValido
                        || Character.isLetter(str.charAt(i));
            }

            if ((filtroEntrada & FILTRO_ENTRADA_NUMERICO) != 0) {
                algumValido = algumValido
                        || Character.isDigit(str.charAt(i));
            }

            if ((filtroEntrada & FILTRO_ENTRADA_ESPACO) != 0) {
                algumValido = algumValido
                        || Character.isWhitespace(str.charAt(i));
            }

            // se o caractere atual nao foi validado por nenhum filtro
            if (!algumValido) {
                Toolkit.getDefaultToolkit().beep();
                return;
            }
        }


        if (iMaxLength <= 0) {
            // aceita qualquer no. de caracteres
            super.insertString(offset, str, attr);
            return;
        }

        int ilen = (getLength() + str.length());

        if (ilen <= iMaxLength) // se o comprimento final for menor...
            super.insertString(offset, str, attr); // ...aceita str
    }


    
}
